package com.tensquare.user.service;

import com.tensquare.user.dao.UserDao;
import com.tensquare.user.pojo.User;
import entity.Result;
import net.bytebuddy.asm.Advice;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.weaver.bcel.BcelAccessForInlineMunger;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import util.IdWorker;


import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * Created by WF on 2020/4/2 15:45
 */
@Service
@Transactional
public class UserService {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Autowired
    private UserDao userDao;
    @Autowired
    private IdWorker idWorker;
    @Autowired
    private BCryptPasswordEncoder encoder;
    //1.发送手机验证码
    public void sendSms(String mobile) {
        //1.1)生成六位数的验证码
        int min = 100000;
        int max = 999999;
        Random random = new Random();
        int i = random.nextInt(max - min);  //生成一个(max-min)范围内的随机数
        if(i < min){
            i = min + i;        //此时得到的就是一个[min,max)范围的随机数
        }
        System.out.println("验证码为 : " + i);
        //1.2)将生成的随机数放到redis中，以便于后面进行验证
        redisTemplate.opsForValue().set("myvalidCode",i,5,TimeUnit.MINUTES);    //设置到期时间为5分钟
        //1.3)使用rabbitmq给微服务后台发送这个信息
        //1.3.1)将要发送的消息进行封装
        Map<String,String> map = new HashMap<>();
        map.put("mobile",mobile);
        map.put("code",i + "");
        //1.3.2)将消息发送出去
        rabbitTemplate.convertAndSend("sms",map);
    }
    //2.注册用户,首先，将用户输入的验证码与redis中的进行比对，如果一致就注册用户
    public boolean register(String code, User user) {
        //2.1)得到redis中的验证码
        String validCode = redisTemplate.opsForValue().get("myvalidCode") + "";
        //2.2)比对两个验证码是否相等
        if(StringUtils.isNotBlank(validCode) && validCode.equals(code)){
            user.setId( idWorker.nextId()+"" );
            user.setFollowcount(0);//关注数
            user.setFanscount(0);//粉丝数
            user.setOnline(0L);//在线时长
            user.setNickname(user.getNickname());
            //对用户输入的密码进行加密
            String password = encoder.encode(user.getPassword());
            //设置用户密码
            user.setPassword(password);
            user.setRegdate(new Date());//注册日期
            user.setUpdatedate(new Date());//更新日期user
            user.setLastdate(new Date());//最后登陆日期
            userDao.save(user);
            return true;
        }
        return false;

    }
    //3.用户登录(进行密码比对)
    public User login(User user) {
        //3.1)根据手机号查询用户是否存在
        User loginUser = userDao.findByMobile(user.getMobile());
        //3.2)判断用户输入的密码与数据库中是否一致
        if(loginUser != null && encoder.matches(user.getPassword(),loginUser.getPassword())){
            return loginUser;
        }
        return null;
    }
    //删除用户
    public void delete(String userId) {
        userDao.deleteById(userId);
    }
    //修改粉丝数
    public void incFans(String userid, int x) {
        userDao.incFans(userid,x);
    }
    //修改关注数
    public void incFollow(String userid, int x) {
        userDao.incFollow(userid,x);
    }
}
